#include<bits/stdc++.h> 
using namespace std;
//	如果Swap(0,*)是唯一允许使用的排序方式，即用0与其他数交换位置，从而达到排序的效果。
//	4 0 2 1 3→swap(0,1)→4 1 2 0 3→swap(0,3)→4 1 2 3 0→swap(0,4)→0 1 2 3 4
//1.每个输入给定一个正整数N≤100000，然后跟着一个{0,1...N-1}的随机序列 
//2.对于每个测试用例，输出最小能使其有序的数字。
//3.排序，规律，性能
//这道题其实要找到最快的路径，其实我们只要把排序想象成是打乱的数字要摆到原位就行，即第i
//个位置的数字应该是i而不是其他数字。所以建立一个数组n存放数字，再建立一个存放数字k对应
//下标的数组id存放下标。然后从找到0的下标开始，每次只交换0所在的下标原本应该有的数字。
//但是需要注意的是，并不是说等若干交换后0回到0的位置就表示排序结束了，有可能只是0恰好归位
//而其他位置的数字还处在打乱的情况中(比如一上来0就在最前面，但是后面都是乱的)。所以还需要
//对数组进行遍历，判断数组是否完全有序。
//如果有序，则表示排序完毕。而如果某个位置出现了前面大于后面的情况，则就有可能是前面一个没排好
//或者后面一个没排好。由于下标和数字一定是对应的，所以只要看谁和下标不一致就行。然后再把0调出来
//让它跟出问题这个交换。然后再重复上述操作，直到有序为止。
//值得一提的是，如果每次都从头到尾遍历一遍的话，必然测试点1和2超时，所以这里我们可以把每一次查出来
//没排序的那个下标存起来，下次遍历的时候直接从这个位置开始找就行，因为这是个稳定的排序方式，后序排序
//并不影响之前排序的结果。 
int n[100000];
int id[100000];
int count_ = 0;
int N;
int m = 1;
void swap(){
	n[id[0]] = id[0];
	int t = id[0];
	id[0] = id[id[0]];
	id[t] = t;
	n[id[0]] = 0;
	count_ ++;
}
int isOK(){
	for(int i = m;i<N;i++){
		if(n[i]<n[i-1]){
			if(n[i]!=i) return i;
			else return i-1;
		}
	}
	return -1;
}
int main(){
	cin>>N;
	for(int i = 0;i<N;i++){
		scanf("%d",&n[i]);
		id[n[i]] = i;
	}
	while(n[0]!=0||m!=-1){
		if(n[0]==0){
			m = isOK();
			if(m==-1) break;
			else{
				n[0] = n[m];
				id[n[m]] = 0;
				n[m] = 0;
				id[0] = m;
				count_++;
			}
			
		}
		swap();
	}
	cout<<count_<<endl;
	return 0;
} 